package httpclient

import (
	"net/http"
	"time"
)

// Config 定义 HTTP 客户端的配置选项
type Config struct {
	// 基础配置
	BaseURL    string        // 基础 URL
	Timeout    time.Duration // 请求超时时间
	MaxRetries int           // 最大重试次数
	RetryDelay time.Duration // 重试延迟时间

	// 代理配置
	ProxyURL string // 代理服务器 URL

	// 认证配置
	Username string // Basic Auth 用户名
	Password string // Basic Auth 密码
	Token    string // Bearer Token

	// 请求头配置
	Headers map[string]string // 默认请求头

	// TLS 配置
	InsecureSkipVerify bool // 是否跳过 TLS 验证

	// Cookie 配置
	Jar http.CookieJar // Cookie 管理器

	// 传输配置
	MaxIdleConns        int           // 最大空闲连接数
	MaxIdleConnsPerHost int           // 每个主机的最大空闲连接数
	IdleConnTimeout     time.Duration // 空闲连接超时时间
}

// DefaultConfig 返回默认配置
func DefaultConfig() *Config {
	return &Config{
		Timeout:             30 * time.Second,
		MaxRetries:          3,
		RetryDelay:          time.Second,
		Headers:             make(map[string]string),
		MaxIdleConns:        100,
		MaxIdleConnsPerHost: 10,
		IdleConnTimeout:     90 * time.Second,
	}
}

// WithBaseURL 设置基础 URL
func (c *Config) WithBaseURL(baseURL string) *Config {
	c.BaseURL = baseURL
	return c
}

// WithTimeout 设置超时时间
func (c *Config) WithTimeout(timeout time.Duration) *Config {
	c.Timeout = timeout
	return c
}

// WithProxy 设置代理
func (c *Config) WithProxy(proxyURL string) *Config {
	c.ProxyURL = proxyURL
	return c
}

// WithBasicAuth 设置 Basic 认证
func (c *Config) WithBasicAuth(username, password string) *Config {
	c.Username = username
	c.Password = password
	return c
}

// WithBearerToken 设置 Bearer Token
func (c *Config) WithBearerToken(token string) *Config {
	c.Token = token
	return c
}

// WithHeader 设置请求头
func (c *Config) WithHeader(key, value string) *Config {
	if c.Headers == nil {
		c.Headers = make(map[string]string)
	}
	c.Headers[key] = value
	return c
}

// WithHeaders 批量设置请求头
func (c *Config) WithHeaders(headers map[string]string) *Config {
	if c.Headers == nil {
		c.Headers = make(map[string]string)
	}
	for k, v := range headers {
		c.Headers[k] = v
	}
	return c
}

// WithInsecureSkipVerify 设置是否跳过 TLS 验证
func (c *Config) WithInsecureSkipVerify(skip bool) *Config {
	c.InsecureSkipVerify = skip
	return c
}

// WithCookieJar 设置 Cookie 管理器
func (c *Config) WithCookieJar(jar http.CookieJar) *Config {
	c.Jar = jar
	return c
}

// WithMaxRetries 设置最大重试次数
func (c *Config) WithMaxRetries(maxRetries int) *Config {
	c.MaxRetries = maxRetries
	return c
}

// WithRetryDelay 设置重试延迟时间
func (c *Config) WithRetryDelay(delay time.Duration) *Config {
	c.RetryDelay = delay
	return c
}

// WithMaxIdleConns 设置最大空闲连接数
func (c *Config) WithMaxIdleConns(maxIdleConns int) *Config {
	c.MaxIdleConns = maxIdleConns
	return c
}

// WithMaxIdleConnsPerHost 设置每个主机的最大空闲连接数
func (c *Config) WithMaxIdleConnsPerHost(maxIdleConnsPerHost int) *Config {
	c.MaxIdleConnsPerHost = maxIdleConnsPerHost
	return c
}

// WithIdleConnTimeout 设置空闲连接超时时间
func (c *Config) WithIdleConnTimeout(timeout time.Duration) *Config {
	c.IdleConnTimeout = timeout
	return c
}
